package com.yonyou.cyxdms.basedata.service.service.questionaire;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
//import com.mysql.jdbc.StringUtils;
import com.yonyou.cyx.framework.util.bean.ApplicationContextHelper;
import com.yonyou.cyx.function.exception.ServiceBizException;
import com.yonyou.cyx.function.utils.bean.BeanMapperUtil;
import com.yonyou.cyx.function.utils.common.CommonUtils;
import com.yonyou.cyx.function.utils.common.DateUtil;
import com.yonyou.cyx.function.utils.common.StringUtils;
import com.yonyou.cyxdms.basedata.client.domains.vo.AnswerVisitUsedVO;
import com.yonyou.cyxdms.basedata.client.domains.vo.CareQuestionVO;
import com.yonyou.cyxdms.basedata.client.domains.vo.QuestionVisitInfoVO;
import com.yonyou.cyxdms.basedata.client.domains.vo.QuestionaireVO;
import com.yonyou.cyxdms.basedata.service.constant.BasedataDictConstants;
import com.yonyou.cyxdms.basedata.service.dto.questionaire.QueryAnswerDTO;
import com.yonyou.cyxdms.basedata.service.dto.questionaire.QuestionnaireDTO;
import com.yonyou.cyxdms.basedata.service.entity.questionaire.QuestionRelationPO;
import com.yonyou.cyxdms.basedata.service.entity.questionaire.QuestionnairePO;
import com.yonyou.cyxdms.basedata.service.repository.questionaire.QuestionRelationMapper;
import com.yonyou.cyxdms.basedata.service.repository.questionaire.QuestionnaireMapper;
import com.yonyou.cyxdms.basedata.service.vo.questionaire.*;
import com.yonyou.cyxdms.framework.bean.dto.user_info.LoginInfoDto;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.time.LocalDateTime;
import java.util.List;

/**
 * <p>
 * 问卷 服务实现类
 * </p>
 *
 * @author renwd
 * @since 2019-09-19
 */
@Service
@Transactional(rollbackFor = Exception.class)
public class QuestionnaireServiceImpl implements QuestionnaireService {

    @Autowired
    QuestionnaireMapper questionnaireMapper;

    @Autowired
    QuestionRelationMapper questionRelationMapper;


    /**
     * 问卷信息列表
     *
     * @param page
     * @param queryAnswerDTO
     * @return com.baomidou.mybatisplus.core.metadata.IPage<com.yonyou.cyxdms.basedata.service.vo.questionaire.QuestionnaireInfoVO>
     * @author dengqiang
     * @since 2019/9/20
     */
    @Override
    public IPage<QuestionnaireInfoVO> queryQuestionnaire(Page<QuestionnaireInfoVO> page, QueryAnswerDTO queryAnswerDTO) {
        LoginInfoDto loginInfoDto = ApplicationContextHelper.getBeanByType(LoginInfoDto.class);
        queryAnswerDTO.setAppId(loginInfoDto.getAppId());
        queryAnswerDTO.setOwnerCode(loginInfoDto.getOwnerCode());
        if(queryAnswerDTO.getQuestionnaireDateEnd() != null){
            queryAnswerDTO.setQuestionnaireDateEnd(DateUtil.dateStrAddDay(queryAnswerDTO.getQuestionnaireDateEnd(), 1, "yyyy-MM-dd"));
        }
        page.setRecords(questionnaireMapper.queryQuestionnaire(page, queryAnswerDTO));
        return page;
    }

    /**
     *  新增问卷及问卷问题内容
     *
     * @param questionnaireDTO
     * @return java.lang.Integer
     * @author dengqiang
     * @since 2019/9/20
     */
    @Override
    public Integer insertQuestionnaire(QuestionnaireDTO questionnaireDTO) {
        LoginInfoDto loginInfoDto = ApplicationContextHelper.getBeanByType(LoginInfoDto.class);
        QueryWrapper<QuestionnairePO> queryWrapper = new QueryWrapper<>();
        queryWrapper.lambda().eq(QuestionnairePO::getAppId, loginInfoDto.getAppId())
                .eq(QuestionnairePO::getOwnerCode, loginInfoDto.getOwnerCode())
                .eq(QuestionnairePO::getQuestionnaireName, questionnaireDTO.getQuestionnaireName());
        List<QuestionnairePO> questionnairePos = questionnaireMapper.selectList(queryWrapper);
        if (!CommonUtils.isNullOrEmpty(questionnairePos)) {
            throw new ServiceBizException("该问卷已经存在");
        }
        //保存问卷
        QuestionnairePO questionnairePo = new QuestionnairePO();
        //设置属性
        setQuestionnaire(questionnairePo,questionnaireDTO);
        //问卷制作时间
        questionnairePo.setQuestionnaireDate(LocalDateTime.now());
        // 数据来源默认本店
        questionnairePo.setDataSources(BasedataDictConstants.DATA_SOURCES_BY_OWNER);

        questionnairePo.setCompanyCode(loginInfoDto.getCompanyCode());
        questionnairePo.setOwnerCode(loginInfoDto.getOwnerCode());
        questionnairePo.setAppId(loginInfoDto.getAppId());
        questionnairePo.setOwnerParCode(loginInfoDto.getOwnerParCode());

        questionnaireMapper.insert(questionnairePo);

        // 保存问卷问题内容
        if (!CommonUtils.isNullOrEmpty(questionnaireDTO.getQuestionList())) {
            for (int i = 0; i < questionnaireDTO.getQuestionList().size(); i++) {
                QuestionRelationPO questionRelationPo = new  QuestionRelationPO();
                //判断问卷是否已经存在问卷问题内容
                List<Long> list = questionnaireMapper.selectQuestionRelation(questionnairePo.getQuestionnaireId(),questionnaireDTO.getQuestionList().get(i).getQuestionId());
                if (CommonUtils.isNullOrEmpty(list)) {
                    // 问卷Id
                    questionRelationPo.setQuestionnaireId(questionnairePo.getQuestionnaireId());
                    // 问题ID
                    questionRelationPo.setQuestionId(questionnaireDTO.getQuestionList().get(i).getQuestionId());
                    // 选项顺序
                    questionRelationPo.setQuestionSortNum(questionnaireDTO.getQuestionList().get(i).getQuestionSortNum());
                    questionRelationMapper.insert(questionRelationPo);
                }
            }
        }



        return 1;
    }

    @Override
    public void setQuestionnaire(QuestionnairePO questionnairePo, QuestionnaireDTO questionnaireDTO) {
        //问卷名称
        questionnairePo.setQuestionnaireName(questionnaireDTO.getQuestionnaireName());
        //问卷类型
        questionnairePo.setQuestionnaireType(questionnaireDTO.getQuestionnaireType());
        //是否启用
        questionnairePo.setIsValid(questionnaireDTO.getIsValid());
    }

    /**
     * 修改问卷及问卷问题内容
     *
     * @param questionnaireDTO
     * @return java.lang.Integer
     * @author dengqiang
     * @since 2019/9/22
     */
    @Override
    public Integer updateQuestionnaire(QuestionnaireDTO questionnaireDTO) {
        LoginInfoDto loginInfoDto = ApplicationContextHelper.getBeanByType(LoginInfoDto.class);
        List<Long> idList = questionnaireMapper.selectQuestionnaireName(loginInfoDto.getAppId(),loginInfoDto.getOwnerCode(),questionnaireDTO.getQuestionnaireId(),questionnaireDTO.getQuestionnaireName());
        if(!CommonUtils.isNullOrEmpty(idList)){
            throw new ServiceBizException("该问卷已经存在");
        }
        QuestionnairePO questionnairePo = questionnaireMapper.selectById(questionnaireDTO.getQuestionnaireId());
        //设置属性
        setQuestionnaire(questionnairePo,questionnaireDTO);
        //修改问卷
        questionnaireMapper.updateById(questionnairePo);
        questionRelationMapper.deleteByQuestionnaireId(questionnairePo.getQuestionnaireId());
        // 保存问卷问题内容
        if (!CommonUtils.isNullOrEmpty(questionnaireDTO.getQuestionList())) {
            for (int i = 0; i < questionnaireDTO.getQuestionList().size(); i++) {
                QuestionRelationPO questionRelationPo = new  QuestionRelationPO();
                // 问卷Id
                questionRelationPo.setQuestionnaireId(questionnairePo.getQuestionnaireId());
                // 问题ID
                questionRelationPo.setQuestionId(questionnaireDTO.getQuestionList().get(i).getQuestionId());
                // 选项顺序
                questionRelationPo.setQuestionSortNum(questionnaireDTO.getQuestionList().get(i).getQuestionSortNum());
                questionRelationMapper.insert(questionRelationPo);
            }
        }
        return 1;
    }

    /**
     * 根据id查询问卷信息
     *
     * @param questionnaireId
     * @return com.yonyou.cyxdms.basedata.service.vo.questionaire.QuestionnaireVO
     * @author dengqiang
     * @since 2019/9/22
     */
    @Override
    public QuestionnaireVO queryQuestionnaireById(Long questionnaireId) {
        QuestionnairePO questionnairePo = questionnaireMapper.selectById(questionnaireId);
        QuestionnaireVO questionnaireVO = new QuestionnaireVO();
        BeanUtils.copyProperties(questionnairePo,questionnaireVO);
        List<QuestionInfoVO> questionInfoVOList = questionnaireMapper.getQuestionByQuestionnaireId(questionnaireId);
        questionnaireVO.setQuestionInfoVOList(questionInfoVOList);
        return questionnaireVO;
    }

    /**
     * 删除问卷及问卷问题内容
     *
     * @param questionnaireId
     * @return java.lang.Integer
     * @author dengqinag
     * @since 2019/9/22
     */
    @Override
    public Integer deleteQuestionnaireById(Long questionnaireId) {
        QueryWrapper<QuestionRelationPO> queryWrapper = new QueryWrapper<>();
        queryWrapper.lambda().eq(QuestionRelationPO::getQuestionnaireId, questionnaireId);
        questionRelationMapper.delete(queryWrapper);
        return questionnaireMapper.deleteById(questionnaireId);
    }

    /**
     * 根据问卷id查询问题信息
     *
     * @param page
     * @param questionnaireId
     * @return com.baomidou.mybatisplus.core.metadata.IPage<com.yonyou.cyxdms.basedata.service.vo.questionaire.QuestionVisitInfoVO>
     * @author dengqiang
     * @since 2019/9/23
     */
    @Override
    public IPage<QuestionInfoVO> queryQuestionByQuestionnaireId(Page<QuestionInfoVO> page, Long questionnaireId) {
        page.setRecords(questionnaireMapper.queryQuestionByQuestionnaireId(page, questionnaireId));
        return page;
    }

    /**
     * 根据问卷类型查询问卷列表信息
     *
     * @param questionnaireType
     * @return java.util.List<com.yonyou.cyxdms.basedata.service.vo.questionaire.QuestionnaireInVO>
     * @author dengqiang
     * @since 2019/9/23
     */
    @Override
    public List<QuestionnaireInVO> queryQuestionnaireByType(String questionnaireType) {
        LoginInfoDto loginInfoDto = ApplicationContextHelper.getBeanByType(LoginInfoDto.class);
        return questionnaireMapper.queryQuestionnaireByType(questionnaireType,BasedataDictConstants.IS_VALID,loginInfoDto.getAppId(),loginInfoDto.getOwnerCode());
    }

    /**
     * 根据id查询问卷信息
     *
     * @param questionaireId
     * @return com.yonyou.cyxdms.basedata.client.domains.vo.QuestionaireVO
     * @author renwd
     * @since 2019/9/25
     */
    @Override
    public QuestionaireVO getQuestionnaireById(Long questionaireId) {
        QuestionnairePO questionnairePo = questionnaireMapper.selectById(questionaireId);
        return BeanMapperUtil.copyProperties(questionnairePo, QuestionaireVO.class);
    }

    /**
     * 根据questionnaireId查询问卷信息列表
     *
     * @param questionnaireId
     * @return java.util.List<com.yonyou.cyxdms.basedata.service.entity.questionaire.CareQuestionVO>
     * @author dengqiang
     * @since 2019/10/11
     */
    @Override
    public List<CareQuestionVO> queryQuestionByCondition(List<Long> questionIdList, Long questionnaireId) {
        return questionnaireMapper.queryQuestionByCondition(questionIdList, questionnaireId);
    }

    /**
     * 根据answerGroupId查询答案列表
     *
     * @param answerGroupId
     * @return java.util.List<com.yonyou.cyxdms.basedata.service.vo.questionaire.AnswerVO>
     * @author dengqiang
     * @since 2019/10/13
     */
    @Override
    public List<AnswerVO> queryAnswerList(Long answerGroupId) {
        return questionnaireMapper.queryAnswerList(answerGroupId);
    }

    /**
     * 根据问卷ID查询问卷问题列表
     *
     * @author ysj
     * @date 2019/11/13
     * @param questionnaireId
     * @return
     */
    @Override
    public List<QuestionVisitInfoVO> queryQuestionVisitInfo(Long questionnaireId) {
        LoginInfoDto loginInfoDto = ApplicationContextHelper.getBeanByType(LoginInfoDto.class);

        //根据问卷ID获取问题列表
        List<QuestionVisitInfoVO> questionVisitInfoVos = questionnaireMapper.queryQuestionVisitInfo(questionnaireId,loginInfoDto.getAppId(),loginInfoDto.getOwnerCode());
        questionVisitInfoVos.forEach(questionVisitInfoVO -> {
            //根据问题组ID获取问题列表
            if(!StringUtils.isNullOrEmpty(questionVisitInfoVO.getAnswerGroupId())){
                List<AnswerVisitUsedVO> answerVisitUsedVos = questionnaireMapper.queryAnswerVisitUsed(Long.parseLong(questionVisitInfoVO.getAnswerGroupId()));
                questionVisitInfoVO.setAnswerList(answerVisitUsedVos);
            }
        });

        return questionVisitInfoVos;
    }

}
